# encoding: utf-8
# 项目名称： 常用设计模式
# @File  : 002-面向对象设计原则.py
# @Author: sun hao
# @Desc : 
# @Date  :   13:24 2024/10/29
from abc import ABCMeta, abstractmethod


class User:
    """普通用户类"""

    def __init__(self, name):
        self.name = name

    def show_name(self):
        print(f"User: {self.name}")


class VipUser(User):
    def __init__(self, name, vip_level):
        super().__init__(name)  # 调用父类的构造函数
        self.vip_level = vip_level

    def show_name(self):
        print(f"VIP User: {self.name}, Level: {self.vip_level}")


""" 创建 普通用户实例 """
normal_user = User("路人甲")
normal_user.show_name()

""" 创建 vip用户实例 """
vip_user = VipUser("路人甲", 1024)
vip_user.show_name()

"""
    定义了一个类名为动物的抽象类， 会步行、会游泳、会飞
    但是不一定所有的动物都会这3样，
    所以直接拆分为3个类，分别继承
"""


class LandAnimal(metaclass=ABCMeta):
    """
    定义了一个抽象类，表示陆地动物，会步行。
    """

    @abstractmethod
    def walk(self):
        pass


class WaterAnimal(metaclass=ABCMeta):
    """
    定义了一个抽象类，表示水生动物，会游泳。
    """

    @abstractmethod
    def swim(self):
        pass


class SkyAnimal(metaclass=ABCMeta):
    """
    定义了一个抽象类，表示天空动物，会飞。
    """

    @abstractmethod
    def fly(self):
        pass


class Tiger(LandAnimal):
    """
    定义一个类名为老虎的类，只会步行。
    """

    def walk(self):
        print("老虎会走路")


class Frog(LandAnimal, WaterAnimal):
    """
    定义一个类名为青蛙的类，会走路也会游泳。
    """

    def walk(self):
        print("青蛙会走路")

    def swim(self):
        print("青蛙会游泳")


tiger = Tiger()
tiger.walk()  # 输出: 老虎会走路

frog = Frog()
frog.walk()  # 输出: 青蛙会走路
frog.swim()  # 输出: 青蛙会游泳
